package structuralModel.agentModel.cglibProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 功能描述:
 * 2024/03/03
 * <p>
 * ZhangYi
 */
public class CglibProxyFactory implements MethodInterceptor {
    private Object target;

    public CglibProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * 功能描述: 获取target 的代理对象
     *
     * @return {@link Object }
     */
    public Object getProxyInstance(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass()); // 设置父类
        enhancer.setCallback(this); // 设置回调对象,就是自己本身
        return enhancer.create(); // 返回实例
    }

    /**
     * 功能描述: 放行方法, 附加操作 也在这里进行
     *
     * @param obj
     * @param method
     * @param args
     * @param methodProxy
     * @return {@link Object }
     */
    @Override
    public Object intercept(Object obj,
                            Method method,
                            Object[] args,
                            MethodProxy methodProxy) throws Throwable {
        // 在方法调用前的处理逻辑
        preLog(method.getName());
        // 调用原始方法
        Object result = methodProxy.invokeSuper(obj, args);
        // 在方法调用后的处理逻辑
        System.out.println("After method call: " + method.getName());
        return result;
    }


    private void preLog(String name){
        System.out.println("Before method call: " + name);
    }
}
